package com.abrindoportas.bsbtour.Test;

import static org.junit.Assert.*;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import com.abrindoportas.bsbtour.produto.Produto;
import com.abrindoportas.bsbtour.util.HibernateUtil;

public class ProdutoTest {

	private static Session sessao;
	private static Transaction transacao;
	
	@BeforeClass
	public static void abreConexao(){
		sessao = HibernateUtil.getSession().getCurrentSession();
		transacao = sessao.beginTransaction();
	}
	
	@AfterClass
	public static void fechaConexao(){
		
		try {
			transacao.commit();
		} catch (Throwable e) {
			System.out.println("Problema no commit, ou seja, no enviar dos dados" + e.getMessage());
		}finally{
			try {
				if (sessao.isOpen()) {
					sessao.close();
				}
			} catch (Exception e2) {
				System.out.println("Problema no fechamento da sessão!" + e2.getMessage());
			}
		}
	}

	@Before
	public void setup(){
		//Campos (Int Estoque, Str Descricao, Date, float valor, Str unidade)
		Produto p1 = new Produto(50,"Caderno",new Date(),7.8f,"Lote");
		Produto p2 = new Produto(40,"Carne",new Date(),7.8f,"Quilo");
		Produto p3 = new Produto(50,"Livro",new Date(),7.8f,"Edicao");
		Produto p4 = new Produto(50,"Caneta",new Date(),7.8f,"Caixa");
		Produto p5 = new Produto(50,"Regua",new Date(),7.8f,"Unidade");
		
		sessao.save(p1);
		sessao.save(p2);
		sessao.save(p3);
		sessao.save(p4);
		sessao.save(p5);
	
	}
	
	@After
	public void limpaBanco(){
		Criteria lista = sessao.createCriteria(Produto.class);
		
		@SuppressWarnings("unchecked")
		List<Produto> produtos = lista.list();
		
		for (Produto produto : produtos) {
			sessao.delete(produto);
		}
	}
	
	@Test
	public void salvarProdutoTest(){
	
		Query consulta = pesquisar("Car");
		Produto produtoPesquisado = (Produto) consulta.uniqueResult();
		
		assertEquals("Quilo", produtoPesquisado.getUnidade());
		
	}
	
	@Test
	public void listaProdutosTest(){
		
		Criteria lista = sessao.createCriteria(Produto.class);
		
		@SuppressWarnings("unchecked")
		List<Produto> produtos = lista.list();
		
		assertEquals(5, produtos.size());
	}
	
	@Test
	public void exluirProdutoTest(){
		Query consulta = pesquisar("Carne");
		Produto produtoDeletado = (Produto) consulta.uniqueResult();
		sessao.delete(produtoDeletado);
		
		produtoDeletado = (Produto) consulta.uniqueResult();
		
		assertNull(null, produtoDeletado);
	}
	
	@Test
	public void alterarProdutoTest(){
		Query consulta = pesquisar("Caderno");
		Produto produtoAlterado = (Produto) consulta.uniqueResult();
		produtoAlterado.setEstoque(60);
		
		sessao.update(produtoAlterado);
		
		produtoAlterado = (Produto) consulta.uniqueResult();
		
		assertEquals(60, produtoAlterado.getEstoque().intValue());
		
		
	}

	private Query pesquisar(String parametro) {
		String sql = "from Produto p where p.descricao like :descricao";
		Query consulta = sessao.createQuery(sql);
		consulta.setString("descricao", "%" + parametro + "%");
		return consulta;
	}
	
}
